home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / eselect / modules / binutils.eselect < prev    next >
Text File  |  2006-04-12  |  7KB  |  228 lines

  1. # Copyright 1999-2005 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Id: binutils.eselect 220 2005-10-17 13:30:18Z ka0ttic $
  4.  
  5. inherit config portage
  6.  
  7. DESCRIPTION="Manage installed versions of sys-devel/binutils"
  8. MAINTAINER="kugelfang@gentoo.org"
  9. SVN_DATE='$Date: 2005-10-17 14:30:18 +0100 (Mon, 17 Oct 2005) $'
  10. VERSION=$(svn_date_to_version "${SVN_DATE}" )
  11.  
  12. # find_targets [patterns]
  13. # find all possible targets [that match one of ${@}]
  14. find_targets() {
  15.     local args=${@} targets
  16.     [[ -z ${args[@]} ]] && args='-*'
  17.     for item in ${args} ; do
  18.         item=${item%%-[1-9]*}
  19.         [[ ${item:0:1} == '-' ]] || item=-${item}
  20.         for file in ${ROOT}/etc/env.d/binutils/config${item} ; do
  21.             [[ -f ${file} ]] || continue
  22.             targets=(${targets[@]} "${file##*/config-}")
  23.         done
  24.     done
  25.     echo ${targets[@]}
  26. }
  27.  
  28. # find_versions
  29. # find all installed version of installed binutils
  30. find_versions() {
  31.     local versions
  32.     for target in $(find_targets) ; do
  33.         for file in ${ROOT}/etc/env.d/binutils/${target}-* ; do
  34.             versions=(${versions[@]} "${file##*/}")
  35.         done
  36.     done
  37.     echo ${versions[@]}
  38. }
  39.  
  40. # is_active $target $version
  41. # returns true if $version is currently used
  42. is_active() {
  43.     [[ ${#@} -eq 2 ]] || die "Need exactly 2 arguments!"
  44.     current=$(load_config ${ROOT}/etc/env.d/binutils/config-${1} CURRENT)
  45.     [[ ${current} == ${2} ]]
  46. }
  47.  
  48. # is_valid $profile
  49. is_valid() {
  50.     ([[ ${#@} -eq 1 ]] && [[ -e ${ROOT}/etc/env.d/binutils/${profile} ]]) \
  51.         || die "Need exactly 1 argument!"
  52.     
  53. }
  54.  
  55. # swtich_profile $profile
  56. # switches binutils to $profile
  57. switch_profile() {
  58.     # set us up
  59.     [[ ${#@} -eq 1 ]] || die "Need exactly 1 argument!"
  60.     local profile=${1##*/}
  61.     local profile_file="${ROOT}/etc/env.d/binutils/${profile}"
  62.     local target targets version binutilspath libpath chost
  63.     version=$(load_config ${profile_file} VER)
  64.     target=$(load_config ${profile_file} TARGET)
  65.     is_active ${target} ${version} \
  66.         && die -q "Profile \"${profile}\" is already active!"
  67.     chost=$(portageq envvar CHOST)
  68.     libpath=$(load_config ${profile_file} LIBPATH)
  69.     libpath=${libpath:-/usr/lib/binutils/${TARGET}/${VER}}
  70.     faketargets=( $(load_config ${profile_file} FAKE_TARGETS) )
  71.  
  72.     # Generate binary symlinks
  73.     echo "Switching to ${profile}..."
  74.     [[ -d  "${ROOT}/usr/${target}/binutils-bin/${version}" ]] \
  75.         || die -q "Can't cd ${ROOT}/usr/${target}/binutils-bin/${version}!"
  76.     mkdir -p "${ROOT}/usr/${target}/bin" \
  77.         || die -q "Can't create ${ROOT}/usr/${target}/bin!"
  78.     
  79.     binutilspath="/usr/${target}/binutils-bin/${version}"
  80.     for app in "${ROOT}"/${binutilspath}/* ; do
  81.         app=${app##*/}
  82.         ln -sf \
  83.             "${binutilspath}/${app}" \
  84.             "${ROOT}/usr/${target}/bin/${app}" \
  85.             || die -q "Linking ${ROOT}/${binutilspath}/${app} failed!"
  86.         ln -sf \
  87.             ../${target}/bin/${app} \
  88.             "${ROOT}/usr/bin/${target}-${app}" \
  89.             || die -q "Linking ${ROOT}/usr/bin/${target}-${app} failed!"
  90.         for fake in ${faketargets} ; do
  91.             [[ -f "${ROOT}/etc/env.d/binutils/config-${fake}" ]] \
  92.                 && continue
  93.             ln -sf ../${target}/bin/${app} "${ROOT}/usr/bin/${fake}-${app}"
  94.         done
  95.         [[ ${chost} == ${target} ]] || continue
  96.         ln -sf \
  97.             ${target}-${app} \
  98.             "${ROOT}/usr/bin/${app}" \
  99.             || die -q "Linking ${ROOT}/usr/bin/${app} failed!"
  100.     done    
  101.     
  102.     # Generate library and ldscripts symlinks
  103.     mkdir -p "${ROOT}"/usr/${target}/lib
  104.     rm -r "${ROOT}"/usr/${target}/lib/ldscripts
  105.     ln -sf "${libpath}/ldscripts" "${ROOT}"/usr/${target}/lib/ldscripts
  106.     [[ ${target} == ${chost} ]] \
  107.         && dest="${ROOT}"/usr/${chost}/lib \
  108.         || dest="${ROOT}"/usr/${chost}/${target}/lib
  109.     mkdir -p "${dest}"
  110.     for lib in "${ROOT}"/${libpath}/lib* ; do
  111.         ln -sf "${libpath}/${lib##*/}" "${dest}/${lib##*/}"
  112.     done
  113.  
  114.     # Generate include symlink
  115.     [[ ${target} == ${chost} ]] \
  116.         && dest="${ROOT}/usr/include" \
  117.         || dest="${ROOT}/usr/${target}/include"
  118.     mkdir -p "${dest}"
  119.     for inc in "${ROOT}"/${libpath}/include/* ; do
  120.         ln -sf "${inc##${ROOT}}" "${dest}/${inc##*/}"
  121.     done
  122.  
  123.     # Update the environment
  124.     if [[ ${target} == ${chost} ]] ; then
  125.         datapath=/usr/share/binutils-date/${target}/${version}
  126.         envfile="${ROOT}/etc/env.d/05binutils"
  127.         [[ -d ${datapath}/man ]] \
  128.             && store_config ${envfile} MANPATH "${datapath}/man"
  129.         [[ -d ${datapath}/info ]] \
  130.             && store_config ${envfile} INFOPATH "${datapath}/info"
  131.         store_config ${envfile} LDPATH "/usr/${target}/lib"
  132.     fi
  133.  
  134.     store_config \
  135.         "${ROOT}"/etc/env.d/binutils/config-${target} \
  136.         CURRENT ${version}
  137.     if [[ ${ROOT:-/} == / ]] && [[ ${target} == ${chost} ]] ; then
  138.         do_action env update
  139.         echo "Please remember to run:"
  140.         echo
  141.         echo "  # source /etc/profile"
  142.         echo
  143.         echo "in order to let changes take effect!"
  144.     fi
  145. }
  146.  
  147. ### list action
  148.  
  149. describe_list() {
  150.     echo "List all installed version of binutils"
  151. }
  152.  
  153. do_list() {
  154.     local targets i=0 active version processed
  155.     targets=( $(find_targets ${@}) )
  156.     
  157.     [[ -z ${targets[@]} ]] \
  158.         && die -q "Pattern ${@} does not match any installed version of binutils!"
  159.     
  160.     for target in $(find_targets) ; do
  161.         [[ ${targets[@]/${target}/} == ${targets[@]} ]] \
  162.             || write_list_start "Installed binutils for target $(highlight ${target})"
  163.         for file in ${ROOT}/etc/env.d/binutils/${@:-*} ; do
  164.             version=${file##*/${target}-}
  165.             [[ ${version} == ${file} ]] && continue
  166.             [[ ${processed[@]/${file}/} == ${processed[@]} ]] || continue
  167.             processed=(${processed[@]} "${file}")
  168.             i=$(( i + 1 ))
  169.             [[ ${targets[@]/${target}/} == ${targets[@]} ]] && continue
  170.             active=''
  171.             is_active ${target} ${version} \
  172.                 && active=' *' 
  173.                 
  174.             write_numbered_list_entry $i "${version}$(highlight "${active}")"
  175.         done
  176.     done
  177. }
  178.  
  179. ### set action
  180.  
  181. describe_set() {
  182.     echo "Activate one of the installed binutils"
  183. }
  184.  
  185. describe_set_parameters() {
  186.     echo "<target>"
  187. }
  188.  
  189. describe_set_options() {
  190.     echo "target : Target name or number (from 'list' action)"
  191. }
  192.  
  193. do_set() {
  194.         [[ ${#@} == 1 ]] \
  195.             || die -q "Please specify exactly one version to activate!"
  196.         local versions file fail=0
  197.         versions=( $(find_versions) )
  198.  
  199.         for item in ${@} ; do
  200.             if is_number ${item} ; then
  201.                 if [[ ${item} -ge 1 ]] && [[ ${item} -le $(( ${#versions[@]} + 2)) ]] ; then
  202.                     switch_profile ${versions[$(( ${item} -1 ))]}
  203.                 else
  204.                     fail=1
  205.                     echo "Item not in range 1-$((${#versions[@]} + 1)): ${item}"
  206.                     continue
  207.                 fi
  208.             else
  209.                 file=( ${ROOT}/etc/env.d/binutils/${item} )
  210.                 if [[ ${#file[@]} -gt 1 ]] ; then
  211.                     fail=1
  212.                     echo "Ambigious pattern: ${item}"
  213.                     continue
  214.                 fi
  215.                 if ! [[ -f ${file} ]] ; then
  216.                     fail=1
  217.                     echo "Pattern doesn't match anything: ${item}" 
  218.                     continue
  219.                 fi
  220.                 switch_profile ${file##*/}
  221.             fi
  222.         done
  223.  
  224.         [[ ${fail} == 1 ]] && die -q "One or more actions have failed!"
  225. }
  226.  
  227. # vim: set ft=eselect :
  228.